我們在Day03有提到過API,可以透過呼叫API去觸發伺服器運作一些功能。
但有時候,專案開發人員自身單純想啟動專案程式運行一些功能,或者使用工作排程去運行專案程式的特定功能。這時候單單只有API功能可能是不足的,所以我們專案也要考慮到透過指令(cmd)參數的變化,去執行不同的功能。因此cmd
簡單來說就是我們在專案內做 「指令」
,可以在終端機上執行。
如果說API的輸入資料是依據網址上的參數(path、query)或請求上的body,那麼cmd的輸入資料
肯定是程式指令前面的環境變數(env)
以及指令後面的參數(args)
。而環境變數
的用法,在昨日的文章範例就使用來載入指定檔案。
以下範例的程式碼可以在這邊下載
同樣地,我採用Go語言做範例,不過任何語言都有差不多的方式可以實作。也歡迎大家使用不同的語言實作並分享
/// 編譯程式: go build -o program .
/// 執行指令: APP=ironman ./program 1 2 3
// cmd・第一式:取所有環境變數
fmt.Println("all environments: ", os.Environ())
// Output: all environments: [APP=ironman GOROOT=/usr/local/go SHELL=/bin/zsh ......忽略]
// cmd・第二式:取指定的環境變數
appInEnv := os.Getenv("APP")
fmt.Println("APP in environments: ", appInEnv)
// Output: APP in environments: ironman
// cmd・第三式:取指令參數
fmt.Println("all args: ", os.Args)
// Output: all args: [./program 1 2 3]
if len(os.Args) < 2 { // 判斷參數除了執行指令本身,有沒有額外參數
// 如果沒有額外參數,正常結束並提示指令
fmt.Println("請輸入其中之一的參數: demo, server")
os.Exit(0)
}
// 定義每個指令,要執行的動作
switch os.Args[1] {
case "demo":
fmt.Println("這是一個示範指令")
case "server":
port := ":" + os.Getenv("PORT")
log.Println("開始建立伺服器 ", port)
log.Fatal(http.ListenAndServe(port, nil))
default:
fmt.Println("請輸入其中之一的參數: demo, server")
os.Exit(1)
}
$ ./program
請輸入其中之一的參數: demo, server
$ ./program demo
這是一個示範指令
$ PORT=8000 ./program server
開始建立伺服器 :8000
簡易指令(cli或cmd)主要是透過環境變數(env)
、參數(args)
的傳入資料去做多樣的變化。而指令的實作除了土炮之外,很多程式語言也都有很多神人做的套件可以直接用來製作cli,例如:Go可用Cobra、Node.js可用commander。
好的指令實作方式,一定要考慮到以下幾點:
以上四點的範例如下:
./gola
GoLa指令
啟動伺服器,提供「狼人殺」、「犯人在跳舞」...等遊戲服務
亦可執行單一指令,或者執行背景排程功能
Usage:
gola [command]
Examples:
環境說明
需傳入以下環境變數:
⚙ APP_ENV : 專案環境
✏ default 預設值
✏ docker 容器開發
✏ local 本機開發
✏ prod 正式
⚙ APP_SITE : 專案端口
✏ default 預設值
--------------
指令說明
⚙ 主要指令
✏ server 運行伺服器
✏ schedule 運行背景排程
✏ run [command name] 執行指定命令
⚙ 可執行的指令 (command name)
✏ demo 範例指令
? 舉例: APP_ENV=local APP_SITE=default ./gola server
? 舉例: APP_ENV=local APP_SITE=default ./gola schedule
? 舉例: APP_ENV=local APP_SITE=default ./gola run demo
Available Commands:
gorpc GoRPC服務
grpc GRPC服務
help Help about any command
run 執行指令
schedule 啟動背景排程
server 啟動伺服器
Flags:
-h, --help help for gola
Use "gola [command] --help" for more information about a command.